package com.hxwm.hwdbtool.core;

import com.hxwm.hwdbtool.entity.core.HwLogInfo;
import javafx.application.Platform;
import javafx.scene.control.Label;
import javafx.scene.control.TableColumn;
import javafx.scene.control.TableView;
import javafx.scene.control.cell.PropertyValueFactory;
import org.apache.log4j.AppenderSkeleton;
import org.apache.log4j.Level;
import org.apache.log4j.spi.LoggingEvent;

public class HwLogAppender extends AppenderSkeleton {
    private static HwLogAppender appender;
    private static Integer logIndex = 0;
    public static TableView tableView = new TableView();
    public static Integer getLogIndex() {
        if(tableView.getItems() != null){
            if(tableView.getItems().size() > 0){
                logIndex = tableView.getItems().size() - 1;
            }
        }
        return logIndex;
    }
    static {
        tableView.setId("hwLogTableView");
        tableView.setEditable(false);
        tableView.setPrefSize(200,200);
        tableView.setPlaceholder(new Label(""));

        TableColumn logTypeCol = new TableColumn<>("Type");
        logTypeCol.setSortable(false);
        logTypeCol.setPrefWidth(80);
        logTypeCol.setCellValueFactory(new PropertyValueFactory<>("type")); // 这里的 "type" 应该是日志对象中的属性名称

        TableColumn logDateCol = new TableColumn<>("Date");
        logDateCol.setSortable(false);
        logDateCol.setPrefWidth(140);
        logDateCol.setCellValueFactory(new PropertyValueFactory<>("date")); // 这里的 "date" 应该是日志对象中的属性名称

        TableColumn logMessageCol = new TableColumn<>("Message");
        logMessageCol.setSortable(false);
        logMessageCol.setPrefWidth(845);
        logMessageCol.setCellValueFactory(new PropertyValueFactory<>("message")); // 这里的 "message" 应该是日志对象中的属性名称

        tableView.getColumns().addAll(logTypeCol,logDateCol,logMessageCol);
    }

    public static HwLogAppender getInstance(){
         if (appender == null) appender = new HwLogAppender();
         return appender;
    }

    /**
     * 打印日志的核心方法
     * @param loggingEvent
     */
    @Override
    protected void append(LoggingEvent loggingEvent) {
        Level level = loggingEvent.getLevel();
        long timeStamp = loggingEvent.getTimeStamp();
        Object messageObject = loggingEvent.getMessage();
        Platform.runLater(()->{
            String message = messageObject.toString();
            tableView.getItems().add(new HwLogInfo(logIndex,level.toString(),timeStamp,message));
        });
    }

    /**
     * 释放资源
     */
    @Override
    public void close() {
        // 不用就不需要实现
    }

    /**
     * 是否需要按照格式输出文本
     * @return
     */
    @Override
    public boolean requiresLayout() {
        return false;
    }
}